package com.aspirecn.core.commons;

import jodd.util.StringUtil;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.log4j.Logger;

public class StringUtils extends org.apache.commons.lang3.StringUtils {

	private final static Logger logger = Logger.getLogger(StringUtils.class);
	
	public static String createRandomString(int length)
	{
		return RandomStringUtils.randomAlphanumeric(length);
	}
	
	
	/**
	 * 字符串中是否包含数组中全部内容
	 * 全部包含 true
	 * 否则 false
	 * @param srcString
	 * @param containsArray
	 * @return
	 */
	public static boolean containsArrayIgnoreCase( String srcString, String[] containsArray )
	{
		if( ArrayUtils.isEmpty(containsArray) )
		{
			return true;
		}
		else
		{
			for( String temp:containsArray )
			{
				if( !StringUtils.containsIgnoreCase(srcString, temp) )
				{
					return false;
				}
			}
		}
		
		return true;
	}
	
	
	/**
	 * 批量替换字符串
	 * @param srcString 源字符串
	 * @param strArray1 
	 * @param strArray2 被替换的字符串数组
	 * 两数组长度要相等，源字符串不为空
	 * @return
	 */
	public static String batchReplace( String srcString, String[] strArray1, String[] strArray2 )
	{
//		String retString = srcString;
		
		// 源字符串不为空
		if( StringUtils.isBlank(srcString) )
		{
			logger.debug("源字符串为空");
			return "";
		}
		
		// 替换数组长度相等
		if( ArrayUtils.isNotEmpty(strArray1) && (ArrayUtils.getLength(strArray1) != ArrayUtils.getLength(strArray2)) )
		{
			logger.debug("替换数组为空或者两数组长度不等");
			return srcString;
		}
		
		//注释部分为个人开发，下面是引用jodd函数
//		// 删除长度超过源字符串或者不包含的数组内容
//		String[] tempstrArray1 = strArray1;
//		String[] tempstrArray2 = strArray2;
//		
//		String[] filterArray = null;
//		for (int i = ArrayUtils.getLength(strArray1) - 1; i >= 0; i--) {			
//			//源字符串不包含或者重复字符串，删除
//			if( !StringUtils.contains(srcString, strArray1[i]) || ArrayUtils.contains(filterArray, strArray1[i]) )
//			{
//				tempstrArray1 = ArrayUtils.remove(tempstrArray1, i);
//				tempstrArray2 = ArrayUtils.remove(tempstrArray2, i);
//			}
//			else
//			{
//				filterArray = ArrayUtils.add(filterArray, strArray1[i]);
//			}
//		}
//		
//		// 替换
//		if( ArrayUtils.isNotEmpty(tempstrArray1) )
//		{
//			// 0.数组排序，从短到长，临时数组，仅做标记用
//			String[] tA = orderByLength(tempstrArray1);
//			
//			// 1.添加标志，头尾填特殊符号#(# #)#
//			for( String temp:tA )
//			{
//				retString = StringUtils.replace(retString, temp, "#(#" + temp + "#)#");
//			}
//			
//			// 2.最终替换
//			for( int i = 0; i < ArrayUtils.getLength(tempstrArray1); i++ )
//			{
//				String srcTemp = "#(#" + tempstrArray1[i] + "#)#";
//				retString = StringUtils.replace(retString, srcTemp, tempstrArray2[i]);
//			}
//		}
//		
//		return retString;		
		
		return StringUtil.replace(srcString,strArray1,strArray2);
	}
	
	
	/**
	 * 根据长度排序。先短后长
	 * @param strArray
	 * @return
	 */
	public static String[] orderByLength( String[] strArray )
	{
		String[] retArray = null;
		
		//1.找出最大和最小的长度
		int minLength = 0;
		int maxLength = 0;
		int[] lengthArray = null;
		for( String temp:strArray )
		{
			lengthArray = ArrayUtils.add(lengthArray, StringUtils.length(temp));
		}
		minLength = NumberUtils.min(lengthArray);
		maxLength = NumberUtils.max(lengthArray);		
		
		//2.构造返回数组
		for( int i = minLength; i <= maxLength; i++ )
		{
			if( ArrayUtils.contains(lengthArray, i) )
			{
				for( String temp:strArray )
				{
					if( StringUtils.length(temp) == i )
					{
						retArray = ArrayUtils.add(retArray, temp);
					}				
				}
			}
		}
		
		return retArray;
	}
	
	
	public static void main( String[] args )
	{
		String srcString = "srcStringsrcStringsrcString";
		String[] array1 = new String[]{ "ring", "ring", "ring","src","srcStringsrcStringsrcString","srcStringsrcStringsrcStringsrcStringsrcStringsrcString" };
		String[] array2 = new String[]{ "ring1", "ring", "ring3","src1","srcStringsrcStringsrcString222","srcStringsrcStringsrcStringsrcStringsrcStringsrcS111tring" };

		//System.out.println( StringUtil.replace(srcString,array1,array2) );
		
//		System.out.println(Wildcard.matchOne("src199",array2));         // true   
//		System.out.println(Wildcard.match("CfgOptions.class", "*g*c**s"));          // true!   
//		System.out.println(Wildcard.match("CfgOptions.class", "??gOpti*c?ass"));    // true   
//		System.out.println(Wildcard.match("CfgOpti*class", "*gOpti\\*class"));      // true   
//		System.out.println(Wildcard.match("CfgOptions.class", "C*ti*c?a?*"));       // true
		
		//System.out.println( batchReplace( srcString,array1,array2 ) );
		
//		System.out.println( ArrayUtils.toString(array1) );
//		System.out.println( ArrayUtils.toString(array2) );
		
	}
}
